Skip to content

Update Lighthouse CI workflow for pull requests#349

Open
SadhanaShree25 wants to merge 17 commits intokeploy:mainfrom
SadhanaShree25:patch-1
Open

Update Lighthouse CI workflow for pull requests#349
SadhanaShree25 wants to merge 17 commits intokeploy:mainfrom
SadhanaShree25:patch-1

Conversation

@SadhanaShree25
Copy link
Copy Markdown

@SadhanaShree25 SadhanaShree25 commented Mar 20, 2026

Related Tickets & Documents


Description

  • Updated existing Lighthouse GitHub Actions workflow
  • Fixed artifact download failure issue
  • Simplified workflow by merging comment and run logic into a single file
  • Improved CI reliability and removed dependency on cross-workflow artifacts

Changes

  • Removed artifact download step causing failure
  • Added direct Lighthouse execution and PR comment step
  • Fixed workflow trigger and execution flow
  • Cleaned up unnecessary steps

Type of Change

  • Chore (maintenance, refactoring, tooling updates)
  • Bug fix (non-breaking change that fixes an issue)
  • CI (updates to continuous integration workflows)
  • New feature (change that adds functionality)
  • Breaking Change (may require updates in existing code)
  • UI improvement (visual or design changes)
  • Performance improvement (optimization or efficiency enhancements)
  • Documentation update (changes to README, guides, etc.)
  • Revert (undo a previous commit or merge)

Testing

  • Triggered workflow using a Pull Request
  • Verified Lighthouse runs successfully
  • Confirmed no artifact-related errors
  • Checked PR comment is generated correctly

Demo

  • Workflow now runs without errors ✅
  • PR shows Lighthouse comment automatically

Environment and Dependencies

  • New Dependencies: None
  • Configuration Changes: Updated existing GitHub Actions workflow

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have tested the workflow changes
  • I have run the build command to ensure there are no errors

Signed-off-by: Sadhana Shree <180205437+SadhanaShree25@users.noreply.github.com>
@SadhanaShree25
Copy link
Copy Markdown
Author

Hi maintainers 👋

I have updated the Lighthouse CI workflow and fixed the artifact issue.

Kindly review and approve the workflows so the checks can run successfully.

Thank you!

@dhananjay6561
Copy link
Copy Markdown
Member

Hey @SadhanaShree25
Kindly look at review comments of Copilot and fix them!
Thanks for contributing

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Lighthouse GitHub Actions workflow to run directly on pull requests (instead of reacting to a separate workflow_run) and to generate/post a PR comment without relying on cross-workflow artifacts.

Changes:

  • Switches the workflow trigger to pull_request and adjusts job permissions.
  • Adds checkout/setup/build steps and runs Lighthouse via treosh/lighthouse-ci-action.
  • Generates a markdown file and posts it as a PR comment via peter-evans/create-or-update-comment.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .github/workflows/lighthouse_comment.yml Outdated
Comment thread .github/workflows/lighthouse_comment.yml
Comment thread .github/workflows/lighthouse_comment.yml Outdated
Comment thread .github/workflows/lighthouse_comment.yml Outdated
Comment thread .github/workflows/lighthouse_comment.yml Outdated
Comment thread .github/workflows/lighthouse_comment.yml
Comment thread .github/workflows/lighthouse_comment.yml
SadhanaShree25 and others added 3 commits April 6, 2026 18:44
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Sadhana Shree <180205437+SadhanaShree25@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Sadhana Shree <180205437+SadhanaShree25@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Sadhana Shree <180205437+SadhanaShree25@users.noreply.github.com>
@dhananjay6561
Copy link
Copy Markdown
Member

hi @SadhanaShree25
please have a review at copilot comments. resolve them and resolve the convrsations

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

.github/workflows/lighthouse_comment.yml:53

  • issue-number: ${{ github.event.pull_request.number }} won’t be populated for workflow_dispatch runs and will cause the comment action to fail. If this workflow is intended to be manually dispatched, pass the PR number as an input (or derive it via the API from a branch/sha) and use that value here.
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body-path: lighthouse-comment.md

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .github/workflows/lighthouse_comment.yml
@dhananjay6561 dhananjay6561 self-requested a review April 13, 2026 16:35
DSingh0304 and others added 13 commits April 13, 2026 23:39
* feat: setup Playwright e2e testing infrastructure

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* feat: add environment variables for WordPress API in Playwright config

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* feat: enhance Playwright tests with new homepage spec and build steps

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* fix: update Playwright config to use hardcoded WordPress API URLs

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* fix: update Playwright workflow permissions and add continue-on-error for PR comments

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* test infrastructure and workflow updates.

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* test: Add comprehensive Playwright E2E for navigation and more stories  component.

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Mock node js server

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Mock json data

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* test: extensive Playwright test coverage for components

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Fixing CI Failures for webkit browser

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Component Test - Footer and Heropost

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Fixing flaky and failed test for webkit browser

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Playwright test for PostHeader as well as PostBody

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Removing the PR commenting feature for now

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* WebKit error fixed

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* MoreStories webkit error fixed

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Fixing flaky MoreStories webkit test

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Update tests/components/PostHeader.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/PostBody.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor viewport checks in Navigation and HomePage tests for improved clarity

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>

* Add tests for ScrollToTop component functionality and accessibility

Signed-off-by: Deep <deep@example.com>

* Add tests for TableContents component functionality on desktop and mobile

Signed-off-by: Deep <deep@example.com>

* Add tests for Tag component functionality and accessibility

Signed-off-by: Deep <deep@example.com>

* Add tests for Testimonials component functionality and accessibility

Signed-off-by: Deep <deep@example.com>

* Add tests for TopBlogs component functionality and accessibility

Signed-off-by: Deep <deep@example.com>

* E2E Test for technology page

Signed-off-by: Deep <deep@example.com>

* E2E Test for technology post page

Signed-off-by: Deep <deep@example.com>

* Update tests/components/Tag.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/ScrollToTop.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/Tag.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/pages/TechnologyPostPage.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/TableContents.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/pages/TechnologyPage.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor navigation logic in PostHeader and ScrollToTop tests to use href attribute for improved reliability

Signed-off-by: Deep <deep@example.com>

* Playwright config and CI changes

Signed-off-by: Deep <deep@example.com>

* Using build server instead of dev

Signed-off-by: Deep <deep@example.com>

* remove waitForTimeout as Playwright natively handles dynamic UI readiness

Signed-off-by: Deep <deep@example.com>

* remove waitForTimeout as Playwright natively handles dynamic UI readiness-2

Signed-off-by: Deep <deep@example.com>

* Removing gaurds in core structural elements

Signed-off-by: Deep <deep@example.com>

* refactor: simplify visibility checks for LinkedIn and Slack social links in footer tests

Signed-off-by: Deep <deep@example.com>

* refactor: add data-testid attributes for improved test targeting in components

Signed-off-by: Deep <deep@example.com>

* test: add data-testid attributes for footer and tags sections to improve test targeting

Signed-off-by: Deep <deep@example.com>

* Update tests/components/ScrollToTop.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/TopBlogs.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/TableContents.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/MoreStories.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/PostBody.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/ScrollToTop.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Update tests/components/TableContents.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Add tests for Author Detail Page and Authors Index Page component availability

Signed-off-by: Deep <deep@example.com>

* Add tests for Community Page, Community Post Page, and Community Search Page component availability

Signed-off-by: Deep <deep@example.com>

* Add tests for Tag Detail Page and Tags Index Page component availability

Signed-off-by: Deep <deep@example.com>

* Add tests for Not Found Page and Search Page component availability

Signed-off-by: Deep <deep@example.com>

* Add tests for Mobile Layout and Navigation responsiveness

Signed-off-by: Deep <deep@example.com>

* Add tests for API Mocking and SEO Meta Tags configuration

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor tests for improved visibility checks and assertions in Navigation, PostHeader, ScrollToTop, TableContents, HomePage, and TechnologyPostPage components

Signed-off-by: Deep <deep@example.com>

* Update component visibility assertions in various test files for improved accuracy

Signed-off-by: Deep <deep@example.com>

* Comment out unused device configurations for Firefox and Webkit in Playwright config

Signed-off-by: Deep <deep@example.com>

* Add community posts fixture and update mock server to handle community category queries

Signed-off-by: Deep <deep@example.com>

* Simplify Playwright E2E tests configuration by removing browser matrix and hardcoding to chromium

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Enhance component tests for improved visibility and accuracy across various pages

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Enhance test reliability by adding timeout and visibility checks in various components

Signed-off-by: Deep <deep@example.com>

* Update @types/node to version 18.19.130 and add engines field for Node.js compatibility

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Enhance mobile layout tests by adding max width checks and improving visibility assertions

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor TOC mobile tests to improve dropdown item selection and visibility checks

Signed-off-by: Deep <deep@example.com>

* Refactor TOC component tests to remove conditional click and ensure visibility checks for first post

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor Playwright configuration and mobile layout tests to improve horizontal overflow checks

Signed-off-by: Deep <deep@example.com>

* Refactor horizontal overflow epsilon to use WIDTH_EPSILON for consistency in mobile layout tests

Signed-off-by: Deep <deep@example.com>

* Refactor test interactions to ensure visibility and enablement before clicks across multiple components

Signed-off-by: Deep <deep@example.com>

* Refactor tests in ScrollToTop, TableContents, TechnologyPostPage, and MobileNavigation for improved visibility and reliability of elements before interactions

Signed-off-by: Deep <deep@example.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>

* Refactor navigation tests to improve URL wait conditions and enhance locator strategies for better reliability

Signed-off-by: Deep <deep@example.com>

* Refactor environment variable loading to improve error handling and provide clearer warnings when .env.test is missing

Signed-off-by: Deep <deep@example.com>

* fix: improve test stability by adding timeouts to element visibility checks and refining URL wait conditions in tests.

Signed-off-by: Deep <deep@example.com>

* refactor: Enhance Playwright tests by adding data-testid attributes to components and improving test selectors.

Signed-off-by: Deep <deep@example.com>

* refactor: enhance Playwright test reliability by using explicit waits for content and data-testid locators.

Signed-off-by: Deep <deep@example.com>

---------

Signed-off-by: DSingh0304 <deepshekhar0306@gmail.com>
Signed-off-by: Deep Shekhar Singh <deepshekhar0306@gmail.com>
Signed-off-by: Deep <deep@example.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Deep <deep@example.com>
Co-authored-by: Manas Manohar <21006907+manasmanohar@users.noreply.github.com>
* Add sidebar ad image with fallback, clickable signup link, and orange glow hover effect

Signed-off-by: dhananjay6561 <dhananjayaggarwal6561@gmail.com>

* resolved copilot comments

Signed-off-by: dhananjay6561 <dhananjayaggarwal6561@gmail.com>

---------

Signed-off-by: dhananjay6561 <dhananjayaggarwal6561@gmail.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
Add analytics script and whitelist its endpoint in CSP connect-src.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
* fix: update analytics and CSP configuration

Add analytics script and whitelist its endpoint in CSP connect-src.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve CSP duplication and Cache-Control scoping issues in vercel.json

* fix: move telemetry script to _app.tsx and remove unsafe Cache-Control from vercel.json

---------

Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Shubham Jain <shubhamkjain@outlook.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
Signed-off-by: dhananjay6561 <dhananjayaggarwal6561@gmail.com>
* aeo update

Signed-off-by: Neha Gupta <gneha21[at]yahoo>

* fix: add llms-full.txt reference to blog llms.txt

Blog llms.txt was missing a pointer to the comprehensive llms-full.txt,
reducing discoverability for AI consumers that only read llms.txt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* feat: add canonical URLs and og:url to blog posts

- Add canonicalUrl prop to Meta and Layout components
- Render <link rel="canonical"> and <meta property="og:url"> per post
- Add og:type=article meta tag
- Pass canonicalUrl from community/[slug] and technology/[slug] pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve all 6 copilot review comments on PR keploy#356

aiReferralTracker.ts:
- Parse referrer with URL() and match hostname exactly or via
  endsWith('.'+domain) to prevent substring false positives
- Declare Window.dataLayer type globally, use ??= for type safety
- Remove all (window as any) casts

_app.tsx:
- Track AI referrals on route changes via Router.events, not just
  initial mount

meta.tsx:
- Make og:type configurable via prop (defaults to "article")
- Homepage now passes ogType="website"

_document.tsx:
- Use getOrganizationSchema() from lib/structured-data instead of
  inline duplicate Organization schema

index.tsx:
- Remove duplicate Organization schema (already in _document.tsx)
- Pass ogType="website" to Layout

layout.tsx:
- Pass ogType prop through to Meta component

SeoMeta.spec.ts:
- Add tests for canonical URL, og:url on post pages
- Add test for og:type="website" on homepage
- Add test for og:type="article" on post pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 4 copilot review comments (round 2)

pages/index.tsx:
- Remove unused getOrganizationSchema import

pages/_app.tsx:
- Revert route-change tracking — document.referrer doesn't change on
  SPA navigations, so re-firing would duplicate ai_referral events.
  Track only on initial landing.

utils/aiReferralTracker.ts:
- Widen dataLayer type to unknown[] to avoid TypeScript friction with
  gtag's non-record pushes

pages/_document.tsx:
- Use shared constants (SITE_URL, ORG_NAME, MAIN_SITE_URL) from
  lib/structured-data instead of hard-coded URLs in Blog schema

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 4 copilot review comments (round 3)

layout.tsx:
- Default ogType to "website" instead of "article" — non-post pages
  (tag, author, search) were incorrectly emitting og:type=article

technology/[slug].tsx, community/[slug].tsx:
- Pass ogType="article" explicitly from post detail pages
- Only set canonicalUrl when post slug is available (not during
  fallback render) to avoid incorrect canonical on loading state

SeoMeta.spec.ts:
- Add e2e test for AI referral tracker — verifies dataLayer event
  is pushed on UTM-attributed landing (?utm_source=chatgpt)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 2 copilot review comments (round 4)

SeoMeta.spec.ts:
- Use page.waitForFunction instead of immediate evaluate to avoid
  flaky test — trackAiReferral runs in useEffect after hydration

llms.txt:
- Clarify that llms-full.txt is hosted on the main site (landing),
  not in blog-website repo. URL is correct since blog is proxied
  through landing's Vercel deployment.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

---------

Signed-off-by: Neha Gupta <gneha21[at]yahoo>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Co-authored-by: Neha Gupta <gneha21[at]yahoo>
Co-authored-by: slayerjain <shubhamkjain@outlook.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: enrich blog structured data and llms.txt for GEO/AEO

lib/structured-data.ts:
- Add dateModified, articleSection to BlogPosting schema
- Add author Person with url using sanitizeAuthorSlug (matches actual routes)
- Add publisher logo width/height for ImageObject compliance
- Add getBlogSchema() export using shared constants

lib/api.ts:
- Add modified field to PostFields GraphQL fragment

pages/_document.tsx:
- Add Organization and Blog JSON-LD via shared helpers (single source)

pages/technology/[slug].tsx, pages/community/[slug].tsx:
- Pass dateModified and articleSection to BlogPosting schema

public/llms.txt:
- Rewrite with blog architecture, 500+ articles, categories, awards,
  products, author pages, and comparison hub link

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 2 copilot comments on PR keploy#359

lib/structured-data.ts:
- Handle ppmaAuthorName as array (sometimes returned as array
  from WordPress) — take first element if array

public/llms.txt:
- Clarify author URL uses sanitized slug format, not raw name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: align authorName type with runtime handling

Type authorName as string | string[] to match WordPress
ppmaAuthorName which can be either format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 2 copilot comments on PR keploy#359

lib/structured-data.ts:
- Handle empty authorName array by falling back to ORG_NAME
- Remove hardcoded logo width/height that don't match actual asset

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* Update public/llms.txt

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: resolve 4 copilot comments on PR keploy#359

lib/structured-data.ts:
- Only set author.url for real authors, not org fallback
  (avoids /authors/keploy 404)

tests/fixtures:
- Add modified field to single-post, technology-posts,
  community-posts mock fixtures

public/llms.txt:
- Remove hardcoded star count that goes stale

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: add modified field to revision node query

Ensures dateModified in JSON-LD stays accurate during preview/revision
flows where Object.assign overwrites post fields from revision data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 3 copilot comments on PR keploy#359

lib/structured-data.ts:
- Use BLOG_NAME constant instead of hardcoded string in getBlogSchema
- Simplify Blog publisher logo to URL string (SVG has no fixed dimensions)

types/post.ts:
- Add optional modified field to Post interface

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: restore ImageObject for Blog publisher logo

Keep consistent with BlogPosting publisher logo format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: use primitive number type instead of boxed Number

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: add actual logo dimensions to BlogPosting publisher

Group.png is 462x539 — added matching width/height to ImageObject.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 4 copilot comments on PR keploy#359

- Reformat all test fixture JSON files with consistent indentation
- Use ORG_LOGO_URL in getBlogSchema publisher logo for consistency
  with getOrganizationSchema and getBlogPostingSchema

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

---------

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ploy#362)

* fix: repair malformed vercel.json (missing closing braces)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 799 duplicate meta descriptions flagged by Bing

Root cause: listing pages (tag, author, search, index) used hardcoded
or ultra-generic meta descriptions, not WordPress content.

- community/index: fix copy-paste bug ("Technology" → "Community")
- technology/index: unique 155-char description
- tag/[slug]: dynamic description including tag name
- tag/index: unique description for tag listing
- authors/[slug]: dynamic description including author name
- authors/index: unique description for author listing
- search, community/search: conditional description with empty-state
- community/[slug], technology/[slug]: quality gate for Yoast metaDesc
  (fallback to title-based description if Yoast desc is <60 chars)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* perf: fix blog Core Web Vitals (LCP, CLS, TBT)

Font loading:
- Remove render-blocking @import for Baloo 2 from CSS
- Add non-blocking font preloads with print→all swap pattern
- Remove duplicate per-page DM Sans link tags

Third-party scripts:
- Move all 5 analytics scripts to lazyOnload strategy
- Remove duplicate telemetry script from _document.tsx

Image optimization:
- Add priority prop to CoverImage for LCP (post header only)
- Add sizes attribute and explicit loading prop
- Convert raw <img> to next/image in BlogSidebar
- Add AVIF/WebP formats and 1-year cache TTL in next.config
- Add content-visibility:auto and aspect-ratio for WP images

JavaScript bundle:
- Dynamic import CodeMirror, BlogSidebar, JsonDiffViewer
- Remove duplicate PrismJS from slug pages
- Replace framer-motion with CSS @Keyframes fadeIn (~30-40kB saved)
- Remove AnimatePresence wrapper from _app.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: technical SEO — clean up sitemap, add canonicals, fix duplicates

- Remove 16 problematic URLs from static sitemap (non-blog URLs,
  wrong-category duplicates)
- Cross-category duplicate fix: posts at wrong /community/ or
  /technology/ path now 301 redirect to correct category
- Add canonical URLs to 7 listing pages (index, tag, author)
- Add noindex to search pages
- Fix soft 404 on empty author pages (return proper 404)
- Fix 302→301 redirects on technology slug pages
- Fix robots.txt sitemap URL (www.keploy.io → keploy.io)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: resolve 12 copilot review comments on PR keploy#362

tag/[slug].tsx:
- Handle undefined/string[] router.query.slug for title/description

technology/[slug].tsx + community/[slug].tsx:
- Add safeTitle guard for fallback render (prevents "undefined")
- Apply description quality gate to both Layout and JSON-LD schema
- Validate category redirect against ['community','technology'] allowlist
- Fix unsafe post?.seo.title access

_document.tsx:
- Replace broken string onLoad with preload+stylesheet pattern
  (React ignores string event handlers in JSX)

post-body.tsx:
- Fix misleading comment about CodeMirror lazy imports

post-body.module.css:
- Replace unsupported attr() aspect-ratio with fixed 16/9

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: address remaining Copilot review comments on PR keploy#362

- Category redirect: validate against ['community','technology'] allowlist,
  return notFound for unknown categories instead of guessing
- Community redirect: use data.post.slug (canonical CMS slug) not request param
- Fallback description: return generic description during router.isFallback
  instead of "Learn about Loading..."
- CSS: remove forced 16/9 aspect-ratio on WP images (browsers use intrinsic ratio)
- BlogSidebar: add sizes="320px" to next/image to prevent oversized downloads
- CodeMirror: clarify comment about lazy loading (PostBody is the dynamic boundary)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: address round 2 Copilot review on blog PR keploy#362

- Update E2E test assertion for new technology index description
- Strip HTML tags and entities from post.title before meta/JSON-LD
- Return notFound for invalid/empty author slugs (was soft 404)
- Add contain-intrinsic-size to content-visibility:auto for CLS stability
- Correct framer-motion removal comment in layout.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: pass tag slug as prop from getStaticProps, make CoverImage sizes configurable

- tag/[slug]: pass tagSlug from getStaticProps so SSR meta tags are correct
- CoverImage: make sizes a prop (default 780px for post header, overridable
  for smaller card contexts)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: replace cross-category redirect with notFound to fix prerendering error

redirect cannot be returned from getStaticProps during prerendering.
Return notFound instead — the post will be served from its correct
category path at runtime via ISR fallback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: E2E failure — add community post fixture to mock server, decode HTML entities

- Add single-community-post.json fixture with category "community"
- Mock server now returns community-categorized post for community slugs
- Decode HTML entities in safeTitle instead of stripping them (&#8217; → ')

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: restore 301 redirect for cross-category posts to preserve SEO signals

notFound drops link equity. Redirect is safe because getStaticPaths only
returns same-category paths — the redirect only fires at ISR runtime for
fallback pages, not during next build prerendering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: extract SEO helpers, fix fixture quotes, add motion-reduce

- Extract sanitizeTitle/getSafeDescription to utils/seo.ts (shared between
  technology and community slug pages)
- Fix single-community-post.json: use double-quoted HTML attrs to match
  the regex patterns in page code
- Add motion-reduce:animate-none to layout fade-in for accessibility

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: harden SEO helpers — sanitize metaDesc, handle empty title, normalize whitespace

- sanitizeTitle returns empty string instead of 'Loading...' placeholder
- getSafeDescription sanitizes metaDesc (strip tags, decode entities, trim)
  before length gate
- Handle empty safeTitle gracefully in fallback description
- Normalize whitespace in all decoded strings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

---------

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
* fix: crash on 404 page when post title or excerpt is null

WordPress can return posts with null title/excerpt. NotFoundPage.tsx
called .toLowerCase() on these without null-checking, causing
"Cannot read properties of null" during both SSR prerendering and
client-side rendering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: address Copilot review — null-safe filtering across all search components

- Precompute normalizedSearchTerm to avoid repeated toLowerCase() calls
- Apply null-safe filtering to more-stories.tsx and community/search.tsx
- Update Post type: title and excerpt are string | null (matches WP reality)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null title/excerpt at component boundary + harden getExcerpt

- NotFoundPage: normalize allPosts once via .map() so downstream
  rendering (getExcerpt, dangerouslySetInnerHTML) never sees null
- getExcerpt: return empty string for null/undefined input
- Mock fixture: add post with null title/excerpt to catch regressions
  in E2E tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null title/excerpt in more-stories and community search

Posts with null title/excerpt from WordPress are now defaulted to empty
strings after filtering, before they reach rendering components
(HeroPost, getExcerpt, dangerouslySetInnerHTML).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: add postId to null fixture, clean up redundant fallbacks, add E2E test

- Add missing postId to null title/excerpt test fixture
- Remove redundant || '' in filter (allPosts.map already normalizes)
- Add E2E test asserting no pageerror events on 404 page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null posts at API layer, revert Post type to non-nullable

- Add normalizePostNode/normalizePostEdges in lib/api.ts — defaults
  null title/excerpt to empty string at the data boundary
- Revert Post.title/excerpt back to string (not nullable) since API
  layer now guarantees non-null values
- Fix E2E test: register pageerror handler before navigation, use
  dedicated 404 URL instead of page.url()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize revision node before Object.assign to prevent null re-introduction

getPostAndMorePosts() applies revision data via Object.assign which can
overwrite the already-normalized title/excerpt with null values from the
revision node. Normalize the revision before applying it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

---------

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
…l.txt (keploy#364)

* fix: crash on 404 page when post title or excerpt is null

WordPress can return posts with null title/excerpt. NotFoundPage.tsx
called .toLowerCase() on these without null-checking, causing
"Cannot read properties of null" during both SSR prerendering and
client-side rendering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: slayerjain <shubhamkjain@outlook.com>

* fix: address Copilot review — null-safe filtering across all search components

- Precompute normalizedSearchTerm to avoid repeated toLowerCase() calls
- Apply null-safe filtering to more-stories.tsx and community/search.tsx
- Update Post type: title and excerpt are string | null (matches WP reality)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null title/excerpt at component boundary + harden getExcerpt

- NotFoundPage: normalize allPosts once via .map() so downstream
  rendering (getExcerpt, dangerouslySetInnerHTML) never sees null
- getExcerpt: return empty string for null/undefined input
- Mock fixture: add post with null title/excerpt to catch regressions
  in E2E tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null title/excerpt in more-stories and community search

Posts with null title/excerpt from WordPress are now defaulted to empty
strings after filtering, before they reach rendering components
(HeroPost, getExcerpt, dangerouslySetInnerHTML).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: add postId to null fixture, clean up redundant fallbacks, add E2E test

- Add missing postId to null title/excerpt test fixture
- Remove redundant || '' in filter (allPosts.map already normalizes)
- Add E2E test asserting no pageerror events on 404 page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize null posts at API layer, revert Post type to non-nullable

- Add normalizePostNode/normalizePostEdges in lib/api.ts — defaults
  null title/excerpt to empty string at the data boundary
- Revert Post.title/excerpt back to string (not nullable) since API
  layer now guarantees non-null values
- Fix E2E test: register pageerror handler before navigation, use
  dedicated 404 URL instead of page.url()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: normalize revision node before Object.assign to prevent null re-introduction

getPostAndMorePosts() applies revision data via Object.assign which can
overwrite the already-normalized title/excerpt with null values from the
revision node. Normalize the revision before applying it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* feat(seo): GEO/AEO Phase 1 — fix meta tags, favicon paths, robots.txt, and add llms-full.txt

- Fix favicon paths in meta.tsx: add /blog/ prefix and .png extension
- Add og:site_name and og:locale meta tags for better social sharing
- Fix subscribe-newsletter alt text from generic "Image" to descriptive
- Remove invalid subdomain path disallows from robots.txt
- Add llms-full.txt for comprehensive AI/LLM crawler content
- Update llms.txt to link to llms-full.txt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: address Copilot review — remove redundant .map() normalization, harden test

- Remove redundant .map() normalization in search, more-stories, NotFoundPage
  since fetchAPI already normalizes title/excerpt to empty strings
- Use null-safe access in filter predicates instead
- Harden NotFoundPage test: wait for load state, capture console errors,
  add post-render buffer to catch hydration errors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* perf: memoize allPosts and filteredAllPosts in NotFoundPage

Wrap with useMemo to avoid O(n) recomputation on every countdown
tick (component re-renders every second).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix(test): only catch pageerror in 404 test, not console.error

Console.error captures CSP violations and network failures from the
test environment that are unrelated to our code changes. Revert to
pageerror-only which catches actual uncaught exceptions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

---------

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
…#365)

* fix: GSC audit — 28 duplicate URL redirects, OG tags, favicon, dateModified

- Added 28 permanent redirects for duplicate /community/ and /technology/
  blog URLs based on WordPress category mapping
- Added 2 broken backlink redirects (end-to-end-testing, cursor-vs-copilot)
- Added article:published_time meta tag to post pages
- Fixed favicon paths to reference correct files with /blog/ prefix
- Fixed structured data logo URL
- Removed duplicate font preload from authors page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

* fix: update publisher.logo dimensions to 512x512 to match android-chrome-512x512.png

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>

---------

Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Alok Kumar <101720005+ALOK07K@users.noreply.github.com>
@dhananjay6561
Copy link
Copy Markdown
Member

@amaan-bhati
copilot comments are addressed
kindly have a look.
Thanks

Comment thread components/BlogSidebar.tsx
Copy link
Copy Markdown
Member

@dhananjay6561 dhananjay6561 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants